深入理解 kafka(三)

第四章 主题和分区

从Kafka的底层实现来说,主题和分区都是逻辑上的概念,分区可以有一至多个副本,每个副本对应一个日志文件,每个日志文件对应一至多个日志分段(LogSegment),每个日志分段还可以细分为索引文件、日志存储文件和快照文件等。

主题的管理

主题的管理包括创建主题、查看主题信息、修改主题和删除主题等操作。可以通过 kafka 提供的 kafka-topics.sh 脚本或者 KafkaAdminClient 的方式来实现。

这一小节,我们主要讲 kafka-topics.sh 的实现。

创建主题

首先建议先将broker端配置参数auto.create.topics.enable设置为false(默认值就是true),因为如果是默认值,当生产者或者消费者与一个不存在的主题有关系时会自动创建该 topic,这种自动创建主题的行为是非预期的,会增加主题的管理与维护的难度,所以在生产环境中最好不要这样。

更加推荐的方式是通过 kafka-topics.sh 脚本来创建主题,如图所示:

image-20200429231103122

我们不仅可以通过日志文件的根目录来查看集群中各个broker的分区副本的分配情况,还可以通过ZooKeeper客户端来获取。当创建一个主题时会在ZooKeeper的/brokers/topics/目录下创建一个同名的实节点,该节点中记录了该主题的分区副本分配方案。示例如下:
image-20200429231146009

示例数据中的”2”:[1,2]表示分区 2 分配了 2 个副本,分别在 brokerId 为 1 和 2 的 broker节点中。

到目前为止,创建主题时的分区副本都是按照既定的内部逻辑来进行分配的。 kafka-topics.sh 脚本中还提供了一个 replica-assignment 参数来手动指定分区副本的分配方案,如图所示:

image-20200429232312480

注意事项:

主题的命名同样不推荐(虽然可以这样做)使用双下画线“”开头,因为以双下画线开头的主题一般看作Kafka的内部主题,比如consumer_offsets和__transaction_state。

分区副本的分配

这里的分区分配,跟前面的生产者和消费者的分区分配不一样。生产者的分区分配是指为每条消息指定其所要发往的分区,消费者中的分区分配是指为消费者指定其可以消费消息的分区,而这里的分区分配是指为集群制定创建主题时的分区副本分配方案,即在哪个broker中创建哪些分区的副本。

在创建主题时,如果使用了replica-assignment参数,那么就按照指定的方案来进行分区副本的创建;如果没有使用replica-assignment参数,那么就需要按照内部的逻辑来计算分配方案了。

使用kafka-topics.sh脚本创建主题时的内部分配逻辑按照机架信息划分成两种策略:未指定机架信息和指定机架信息。默认就是 未指定机架信息的分配策略「即 broker.rack 参数为 null」。

查看主题

在 kafka-topics.sh 中使用 list 或者 describe 就可以查看主题信息。list 可以查看所有的当前可用主题, describe 可以查看单个信息的主题的详细信息。

Thank you for your accept. mua!
-------------本文结束感谢您的阅读-------------